package com.wf.controller;

import com.wf.constant.MessageConstant;
import com.wf.domain.SysUser;
import com.wf.dto.FaceDTO;
import com.wf.exception.BankException;
import com.wf.util.AliFaceUtil;
import com.wf.util.AliOssUtil;
import com.wf.util.FileNameUtils;
import com.wf.web.domain.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 身份识别接口
 * 处理与人脸识别相关的请求
 */
@RestController
@RequestMapping("/identify")
@CrossOrigin
public class IdentifyController {

    @Autowired
    AliOssUtil aliOssUtil; // 阿里云OSS工具类
    @Autowired
    AliFaceUtil aliFaceUtil; // 阿里云人脸识别工具类

    /**
     * 添加人脸信息
     * 该方法用于上传用户的人脸照片，并将照片添加到人脸识别数据库中
     *
     * @param file 上传的文件
     * @return 上传成功与否的结果，包含文件路径
     * @throws BankException 银行自定义异常
     */
    @PostMapping("/addFace")
    public Result addFace(@RequestPart MultipartFile file) throws BankException {
        // 生成新的文件名
        String objectName = FileNameUtils.getFileName(file.getOriginalFilename());

        try {
            // 调用aliOssUtil的upload方法上传文件，并获取上传后的文件路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            FaceDTO faceDTO = new FaceDTO();
            faceDTO.setDbName("default");
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof SysUser) {
                SysUser sysUser = (SysUser) principal;
                faceDTO.setEntityId(((SysUser) principal).getUserId());
                if (sysUser.getBorrowAuthStatus() == 0) {
                    aliFaceUtil.createFaceDb(faceDTO);
                }
            }
            faceDTO.setImageUrl(filePath);
            aliFaceUtil.addFace(faceDTO);
            // 返回成功的结果，包含文件路径
            return Result.success(filePath);
        } catch (IOException e) {
            // 如果发生IO异常，记录错误日志
            throw new BankException(MessageConstant.UPLOAD_FAILED);
        }

    }

    /**
     * 人脸识别搜索
     * 该方法用于上传用户的人脸照片，并与数据库中的人脸信息进行比对
     *
     * @param file 上传的文件
     * @return 人脸识别成功与否的结果
     * @throws BankException 银行自定义异常
     */
    @PostMapping("/searchFace")
    public Result searchFace(@RequestPart MultipartFile file) throws BankException {
        // 生成新的文件名
        String objectName = FileNameUtils.getFileName(file.getOriginalFilename());

        try {
            // 调用aliOssUtil的upload方法上传文件，并获取上传后的文件路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            FaceDTO faceDTO = new FaceDTO();
            faceDTO.setDbName("default");
            faceDTO.setImageUrl(filePath);
            Boolean b = aliFaceUtil.searchFace(faceDTO);
            if (b) {
                // TODO 更新数据库中的认证状态
                return Result.success("人脸识别成功");
            } else {
                return Result.failure("人脸识别失败");
            }
        } catch (IOException e) {
            // 如果发生IO异常，记录错误日志
            throw new BankException(MessageConstant.UPLOAD_FAILED);
        }

    }


}
